package optymalizacjaSkladowania;

import skladowisko.Kontener;
import skladowisko.Pole;
import skladowisko.Skladowisko;
import skladowisko.Terminal;

/**
 *
 * @author Krzysiek
 */
public class WszystkieRazemAnalitykSkladowania extends ProstyAnalitykSkladowania
{

    private Skladowisko aktualneSkladowisko = null;

    public WszystkieRazemAnalitykSkladowania(Terminal terminal)
    {
        super(terminal);
    }

    public WszystkieRazemAnalitykSkladowania()
    {
    }

    @Override
    protected boolean przydzielMiejsceKontenerowi(Kontener k, PropozycjaPrzydzialow propozycja)
    {

        if(k.getId() == 114)
        {
            k.getArmator();
        }

        if (aktualneSkladowisko == null || aktualneSkladowisko.ileWolnychMiejsc() == 0 || propozycja.getPrzydzialy().size()==0)
        {
            aktualneSkladowisko = znajdzSkladowisko();
        }

        


        Pole pole;
        for (int i = 0; i < aktualneSkladowisko.getRzedy(); i++)
        {
            for (int j = 0; j < aktualneSkladowisko.getKolumny(); j++)
            {
                pole = aktualneSkladowisko.getPole(j + 1, i + 1);
                boolean wolne = !pole.getZawartoscPola().isPelne();
                boolean brakPropozycji = !propozycja.czyMiejsceZajete(pole.getZawartoscPola().getPierwszaWolnaWarstwa());
                if (wolne && brakPropozycji)
                {
                    Przydzial przydzial = new Przydzial(pole.getZawartoscPola().getPierwszaWolnaWarstwa(), k);
                    pole.getZawartoscPola().rezerwujPierwszaWolna();
                    propozycja.addPrzydzial(przydzial);
                    return true;
                }
            }
        }

        return false;
    }

    @Override
    public void clear()
    {
        super.clear();
    }

    private Skladowisko znajdzSkladowisko()
    {
        int result = 0;
        Skladowisko best = null;
        for (Skladowisko skl : terminal.getSkladowiska())
        {
            int ile = skl.ileWolnychMiejsc();
            if (ile > result)
            {
                result = ile;
                best = skl;
            }
        }
        return best;
    }

    @Override
    public String toString()
    {
        return "Analityk przydzielający losowe wolne miejsce na składowisku";
    }
}
